from rest_framework.throttling import ScopedRateThrottle, SimpleRateThrottle
import time


class MyThrottle(SimpleRateThrottle):
    scope = 'manual_initial'

    def get_cache_key(self, request, view):
        # return 什么 就将return 的 值 作为频率限制的key值
        print(request.META)
        return request.META.get('REMOTE_ADDR')


# 自定制的频率限制类
class IPThrottle:
    # 定义成类属性, 所有对象用的都是这个
    VISIT_DIC = {}

    def __init__(self):
        self.history_list = []

    def allow_request(self, request, view):
        """
        1.取出访问者ip
        2.判断当前ip是否在访问字典里，如果不在，添加进去，并且直接返回True，表示第一次访问，如果在字典里里，继续往下走
        3.循环判断当前ip的列表，有值，并且当前时间减去列表的最后一个时间大于60s，把这种数据pop掉，这样列表中只有60s以内的访问时间
        4.判断当前列表是否小于3，如果小于，说明一分钟之内访问不足3次，把当前时间插入到列表第一个位置，返回True，顺利通过
        5.当大于等于3，说明一分钟访问超过三次，返回false验证失败
        :return: bool
        """
        ip = request.META.get('REMOTE_ADDR')
        ctime = time.time()
        if ip not in self.VISIT_DIC:
            self.VISIT_DIC[ip] = [ctime, ]
            return True
        self.history_list = self.VISIT_DIC[ip]  # 当前访问者时间列表
        while True:
            if ctime - self.history_list[-1] > 60:
                self.history_list.pop()  # 把最后一个移除
            else:
                break
        if len(self.history_list) < 3:
            self.history_list.insert(0, ctime)
            return True
        else:
            return False

    def wait(self):
        # 当前时间，减去列表中最后一个时间
        ctime = time.time()
        return 60 - (ctime - self.history_list[-1])